perm filename UNBIND.SAI[ALF,DEK] blob sn#619056 filedate 1981-10-19 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	begin comment Translates Alphatype boundary data into symbolic form.
C00006 00003
C00011 00004	setprint("UNBIND.OUT","B")
C00014 ENDMK
C⊗;
begin comment Translates Alphatype boundary data into symbolic form.
Output is in UNBIND.OUT.  The input is read from an .ANT file into an
array, one byte at a time, followed by -1;

require "{}{}" delimiters;
define crlf = { ('15 & '12) };

integer ant; string antnam;
integer chrno, sections, secno, encode, seed, dirptr;
preload_with 
'0,'317,'176,'156,'3,'377,'377,'377,
'377,'377,'377,'377,'377,'340,'301,'203,
'7,'17,'36,'74,'170,'360,'340,'301,
'43,'340,'301,'203,'7,'17,'36,'74,
'170,'360,'340,'301,'66,'140,'32,'262,
'141,'303,'246,'151,'52,'126,'254,'252,
'312,'352,'72,'357,'226,'347,'171,'237,
'271,'317,'344,'276,'163,'347,'316,'235,
'334,'301,'354,'340,'166,'360,'340,'41,
'360,'240,'41,'360,'340,'301,'203,'7,
'17,'36,'74,'170,'360,'340,'301,'203,
'7,'17,'36,'74,'170,'360,'340,'301,
'203,'7,'17,'36,'74,'170,'360,'340,
'111,'14,'74,'150,'10,'74,'370,'6,
'144,'103,'262,'41,'331,'260,'141,'303,
'206,'115,'323,'124,'254,'232,'312,'362,
'136,'131,'226,'347,'171,'236,'71,'163,
'337,'367,'175,'47,'167,'356,'140,'166,
'360,'340,'301,'203,'7,'17,'36,'74,
'170,'360,'140,'41,'0,'0,'15,'144,
'257,'1,'240,'20,'360,'240,'21,'120,
'30,'170,'320,'10,'0,'0,'126,'144,
'256,'1,'340,'211,'200,'7,'15,'201,
'47,'6,'36,'64,'4,'0,
-1;
integer array inbytes[0:1024];

preload_with "SE ","S ","SW ","W ","NW ","N ","NE ","E ";
string array dircode[0:7];
preload_with +1,0,-1,-1,-1,0,+1,+1; integer array xdel[0:7];
preload_with -1,-1,-1,0,+1,+1,+1,0; integer array ydel[0:7];

integer i,eob,acc,bits,zero,x,y,nonzero;


procedure byte;
if eob=0 then
	begin integer t; print(crlf,"'",cvos(t←inbytes[i]),"; "); i←i+1;
	if t<0 then eob←1
	else acc←acc+(t lsh bits);
	bits←bits+8;
	if t=0 then nonzero←0 else nonzero←1;
	end;

integer procedure three;
	begin integer t;
	if bits<3 then byte;
	t←acc land 7; acc←acc lsh -3; bits←bits-3;
	print(t,": ");
	return(t);
	end;

procedure step(integer d);
	begin integer dd; dd←d land 7;
	print(dircode[dd]); x←x+xdel[dd]; y←y+ydel[dd];
	end;

procedure doit;
  begin "doit"
  integer zz,zzc,dir;
  zzc←3; i←0; eob←0;
  while true do
	begin acc←bits←0; byte;
	if eob then done;
	if acc neq 0 then print(crlf,"That byte should have been zero!");
	acc←bits←0; byte; byte; dir←acc lsh -13; zz←(acc lsh -11) land 3;
	if zz neq zzc then
		print(crlf,"The zz value ",zz," should be ",zzc,"!");
	zz←zzc; zzc←0;
	x←acc land '3777; print(" starting column ",x,
		", starting direction ",dircode[dir]);
	acc←bits←0; byte; byte;
	if acc>'7777 then
		print(crlf,"Leading four bits should have been zero!");
	y←acc land '3777; print(" starting row ",y);
	if acc land '4000 then print(", coming from the left")
	else print(", coming from the right");
	if zz then
		begin byte; print(" (these eight bytes are ignored...)");
		byte; byte; byte; byte; byte; byte; byte;
		end;
	acc←bits←0;
	while true do
		begin case three of begin
		[1] begin step(dir-1);step(dir-1);step(dir-1);
			dir←(dir-1)land 7 end;
		[2] begin step(dir-1);step(dir);step(dir-1);
			dir←(dir-1)land 7 end;
		[3] begin step(dir);step(dir-1);step(dir);
			dir←(dir-1)land 7 end;
		[4] begin step(dir);step(dir);step(dir) end;
		[5] begin step(dir);step(dir+1);step(dir);
			dir←(dir+1)land 7 end;
		[6] begin step(dir+1);step(dir);step(dir+1);
			dir←(dir+1)land 7 end;
		[7] begin step(dir+1);step(dir+1);step(dir+1);
			dir←(dir+1)land 7 end;
		[0] begin case three of begin
			[0] done;
			[1] begin step(dir-1);step(dir-1);step(dir-2);
				dir←(dir-2)land 7 end;
			[2] begin step(dir-1);step(dir-2);step(dir-2);
				dir←(dir-2)land 7 end;
			[3] begin step(dir-2);step(dir-2);step(dir-2);
				dir←(dir-2)land 7 end;
			[5] begin step(dir+2);step(dir+2);step(dir+2);
				dir←(dir+2)land 7 end;
			[6] begin step(dir+1);step(dir+2);step(dir+2);
				dir←(dir+2)land 7 end;
			[7] begin step(dir+1);step(dir+1);step(dir+2);
				dir←(dir+2)land 7 end;
			[4] begin integer t; t←3*three+9;
				if t=9 then print(crlf,"Bad codes (040)!")
				else print(t,"x",dircode[dir]);
				x←x+t*xdel[dir]; y←y+t*ydel[dir];
				end;
			else comment there's no other case;
			  end;
			end;
		else comment there's no other case;
		  end;
		print(" (",x,",",y,") ");
		end;
	print(" end of cycle.");
	if nonzero then
		begin byte; if nonzero then print(" Should have been zero!");
		end;
	end;
  print(crlf);
  end "doit";
setprint("UNBIND.OUT","B");
doit;
end